package com.vanysoft.business.base.team.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.vanysoft.business.base.tag.controller.demo.UserExport;
import com.vanysoft.business.base.team.dao.BaseTeamMapper;
import com.vanysoft.business.base.team.dao.BaseTeamUsersMapper;
import com.vanysoft.business.base.team.entity.TBaseTeam;
import com.vanysoft.business.base.team.entity.TBaseTeamUsers;
import com.vanysoft.business.sys.entity.UserInfo;
import com.vanysoft.framework.aop.VanySoftAspectException;
import com.vanysoft.framework.constants.DbConstants;
import com.vanysoft.framework.messagesource.MessageCodeConstant;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 类名称：BaseTeamService
 * 类描述：群组Service类
 * 创建人：SharpClaw_x
 * 创建时间：2017年5月26日 上午11:26:59
 * 修改人：SharpClaw_x
 * 修改时间：2017年5月26日 上午11:26:59
 * 版本信息：@version 1.0
 * Copyright (c) 2017SharpClaw-版权所有
 * 修改备注：
 */
@Service
@Transactional(readOnly = true)
public class BaseTeamService {

    @Autowired
    private BaseTeamMapper teamMapper;

    @Autowired
    private BaseTeamUsersMapper teamUsersMapper;

    /**
     * Function Name               addTeam
     *
     * @param team
     * @param loginUser
     * @return
     * @throws VanySoftAspectException
     * @description 添加群组
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月26日 下午1:52:58           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public TBaseTeam addTeam(TBaseTeam team, UserInfo userInfo) throws VanySoftAspectException {

        if (StringUtils.isBlank(team.getTeamName())) {
            throw new VanySoftAspectException(MessageCodeConstant.TeamException.NAME_EMPTY);
        }

        if (checkTeamNameExist(team.getTeamName(), userInfo.getId())) {
            throw new VanySoftAspectException(MessageCodeConstant.TeamException.NAME_EXIST);
        }

        TBaseTeam teamDB = new TBaseTeam();
        teamDB.setTeamCode(UUID.randomUUID().toString());
        teamDB.setTeamName(team.getTeamName());
        teamDB.setOwner(userInfo.getId());
        teamDB.setIsAvailable(DbConstants.IS_AVAILABLE);
        teamDB.setUpdateTime(new Date());

        teamMapper.insertSelective(teamDB);
        return teamDB;
    }

    /**
     * Function Name               modifyTeam
     *
     * @param team
     * @return
     * @throws VanySoftAspectException
     * @description 修改
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月26日 下午3:11:22           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public String modifyTeam(TBaseTeam team) throws VanySoftAspectException {

        if (StringUtils.isBlank(team.getTeamName())) {
            throw new VanySoftAspectException(MessageCodeConstant.TeamException.NAME_EMPTY);
        }
        TBaseTeam teamDB = teamMapper.selectByPrimaryKey(team.getTeamCode());

        if (checkTeamNameExist(team.getTeamName(), teamDB.getOwner())) {
            throw new VanySoftAspectException(MessageCodeConstant.TeamException.NAME_EXIST);
        }

        teamDB.setTeamName(team.getTeamName());
        teamDB.setUpdateTime(new Date());

        teamMapper.updateByPrimaryKeySelective(teamDB);

        return MessageCodeConstant.RTN_CODE_SUCCESS;// FIXME **
    }

    /**
     * Function Name               deleteTeam
     *
     * @param teamCode
     * @return
     * @throws VanySoftAspectException
     * @description 逻辑删除
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月26日 下午5:12:46           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public void deleteTeam(String teamCode) throws VanySoftAspectException {
        if (checkTeamHasUsers(teamCode)) {
            throw new VanySoftAspectException(MessageCodeConstant.TeamException.USER_EXIST);
        }

        TBaseTeam team = teamMapper.selectByPrimaryKey(teamCode);
        team.setIsAvailable(DbConstants.IS_NOT_AVAILABLE);
        team.setUpdateTime(new Date());

        teamMapper.updateByPrimaryKeySelective(team);

    }

    /**
     * Function Name               queryTeamUsers
     *
     * @param teamCode
     * @param pageNo
     * @param pageSize
     * @return
     * @description 查询群组人员，分页
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 上午9:35:22           SharpClaw_x      Initial
     * *********************************************************************
     */
    public Map<String, Object> queryTeamUsers(String teamCode, String search, Integer pageNo, Integer pageSize) {

        Page<Map<String, Object>> page = new Page<>(pageNo, pageSize);
        List<Map<String, Object>> rows = teamMapper.queryTeamUsers(page, teamCode, search);
        page.setRecords(rows);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("rows", rows);
        map.put("total", page.getTotal());

        return map;
    }

    /**
     * Function Name               queryTeamUsersAll
     *
     * @param teamCode
     * @param search
     * @return
     * @description 查询当前群组下的所有人。（导出）
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月22日 上午11:28:48           SharpClaw_x      Initial
     * *********************************************************************
     */
    public UserExport queryTeamExcelUsers(String teamCode, String search) {

        UserExport export = new UserExport();

        export.setUsers(teamMapper.queryTeamUsers(teamCode, search));

        TBaseTeam team = teamMapper.selectByPrimaryKey(teamCode);
        export.setFileName(team.getTeamName());

        return export;
    }

    /**
     * Function Name               modifyTeamStatus
     *
     * @param teamCode
     * @param status
     * @return
     * @description 修改群组状态
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月1日 下午4:19:38           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public String modifyTeamStatus(String teamCode, String status) {

        TBaseTeam team = teamMapper.selectByPrimaryKey(teamCode);
        team.setUpdateTime(new Date());

        teamMapper.updateByPrimaryKey(team);

        return MessageCodeConstant.RTN_CODE_SUCCESS;// FIXME **
    }


    /**
     * Function Name               loadMyTeams
     *
     * @param userId
     * @return
     * @description 查询我的群组列表
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 上午9:35:38           SharpClaw_x      Initial
     * *********************************************************************
     */
    public List<Map<String, String>> loadMyTeams(String userId) {
        List<Map<String, String>> teams = teamMapper.queryUserTeam(userId);
        return teams;
    }

    /**
     * Function Name               addTeamUsers
     *
     * @param userCodes
     * @param teamCode
     * @return
     * @description 选择人员添加到群组
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 上午9:52:47           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public void addTeamUsers(String userCodes, String teamCode) {
        if (StringUtils.isNotEmpty(userCodes)) {
            String[] userCodeArr = userCodes.split(",");
            for (String userCode : userCodeArr) {
                if (!checkUserBelongToTeam(userCode, teamCode)) {
                    TBaseTeamUsers teamUser = new TBaseTeamUsers();
                    teamUser.setUserTeamId(UUID.randomUUID().toString());
                    teamUser.setTeamCode(teamCode);
                    teamUser.setUserId(userCode);

                    teamUsersMapper.insert(teamUser);
                }
            }
        }
    }

    /**
     * Function Name               delTeamUserBatch
     *
     * @param teamUserCOdes
     * @description 批量删除群组
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月19日 上午10:02:55           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public void delTeamUserBatch(String teamUserCodes) {
        if (StringUtils.isNotEmpty(teamUserCodes)) {
            String[] teamUserCode = teamUserCodes.split(",");
            for (String code : teamUserCode) {
                teamUsersMapper.deleteByPrimaryKey(code);
            }
        }
    }

    /**
     * Function Name               checkUserBelongToTeam
     *
     * @param userCode
     * @param teamCode
     * @return
     * @description 检查当前人是否属于该群组
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 上午9:46:56           SharpClaw_x      Initial
     * *********************************************************************
     */
    private boolean checkUserBelongToTeam(String userCode, String teamCode) {
        int i = teamUsersMapper.checkUserBelongToTeam(userCode, teamCode);

        if (i > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Function Name               checkTeamNameExist
     *
     * @param teamName
     * @return
     * @description 检查名称是否重复
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月26日 下午2:25:49           SharpClaw_x      Initial
     * *********************************************************************
     */
    private boolean checkTeamNameExist(String teamName, String owner) {
        int i = teamMapper.queryTeamNameCount(teamName, owner);

        if (i > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Function Name               checkTeamUsersExist
     *
     * @param teamCode
     * @return
     * @description 查询群组下是否有人
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月26日 下午3:20:30           SharpClaw_x      Initial
     * *********************************************************************
     */
    private boolean checkTeamHasUsers(String teamCode) {
        int i = teamUsersMapper.queryTeamUserCount(teamCode);

        if (i > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Function Name               loadTeamsInfo
     *
     * @param userCode
     * @return
     * @description 根据用户代码查询可以看到的群组信息集合
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月6日 下午9:17:03          SharpClaw_x                     Initial
     * *********************************************************************
     */
    public List<Map<String, Object>> loadCanSeeTeamsInfoByUserCode(String userCode) {

        List<Map<String, Object>> teamList = teamMapper.loadCanSeeTeamsInfoByUserCode(userCode);
        return teamList;
    }

    /**
     * Function Name               loadFunctionByTeamCode
     *
     * @param loginUserCode
     * @param teamCode
     * @return
     * @description 根据群组代码及当前登录人员代码查询已分配功能权限和未分配功能权限
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月7日 上午10:29:22          SharpClaw_x                     Initial
     * *********************************************************************
     */
    public Map<String, Object> loadFunctionByTeamCode(String loginUserCode, String teamCode) {

        Map<String, Object> resultMap = new HashMap<>();
//		//1.当前登录用户拥有菜单功能权限字符串-(非递归去重)
//		String loginUserFunctions=tBaseUserFunctionsMapper.loadFunctionByUserCodeUnion(loginUserCode);
//		//2.所选组织机构已分配菜单功能权限(非递归)
//		String allotFunction=teamFunctionsMapper.queryTeamFunctionByTeamCode(teamCode);
//		//3.未分配菜单功能权限=登录用户已拥有菜单功能权限-组织机构已分配功能权限-(非递归)
//		String noAllotFunction=baseUserService.noAllotStr(loginUserFunctions, allotFunction);
//		
//		//已分配功能集合代码-(递归,重复)
//		List<Map> allotFunctionList = tBaseUserFunctionsMapper.loadFunctionByCodes(allotFunction);
//		//已分配功能字符串-(去重)
//		String allotFunctionStrs=CommonUtil.removeRepeatCode(allotFunctionList, "functionCodes");
//		//已分配功能树状结构集合
//		List<Map> allotTreeList=baseFunctionMapper.queryFunctionInfoByCodesPart(allotFunctionStrs);
//
//		//未分配功能集合代码-(递归,重复)
//		List<Map> noAllotFunctionList = tBaseUserFunctionsMapper.loadFunctionByCodes(noAllotFunction);
//		//未分配功能字符串-(去重)
//		String noAllotFunctionStrs=CommonUtil.removeRepeatCode(noAllotFunctionList, "functionCodes");
//		//未分配功能树状结构集合
//		List<Map> noAllotTreeList=baseFunctionMapper.queryFunctionInfoByCodesPart(noAllotFunctionStrs);
//		
//		
//		//根据功能字符串处理成树状结构图
//		
//		//已分配功能
//		List<Map<String,Object>> allotFunctionMapList=CommonUtil.getTreeDataList(allotTreeList, "functionCode", "parentFunctionCode");
//		//未分配功能
//		List<Map<String,Object>> noAllotFunctionMapList=CommonUtil.getTreeDataList(noAllotTreeList, "functionCode", "parentFunctionCode");
//
//		resultMap.put("noAllotFunction", noAllotFunctionMapList);
//		resultMap.put("allotFunction", allotFunctionMapList);

        return resultMap;

    }

    /**
     * Function Name               modifyTeamFunctionAllotAndRemove
     *
     * @param teamCode
     * @param functionCodes
     * @return
     * @description 群组功能分配与移除
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月7日 上午11:02:24          SharpClaw_x                     Initial
     * *********************************************************************
     */
    public void modifyTeamFunctionAllotAndRemove(String teamCode, String functionCodes) {
//		if(StringUtils.isEmpty(functionCodes)){
//			functionCodes="";
//		}
//		Map map = new HashMap();
//		//移除所有权限
//		teamFunctionsMapper.deleteAllTeamFunctionByTeamCode(teamCode);
//		
//		//重新添加
//		String[] functionCodeGroup=functionCodes.split(",");
//		for(int i=0;i<functionCodeGroup.length;i++){
//			TBaseTeamFunctions tBaseTeamFunctions=new TBaseTeamFunctions();
//			tBaseTeamFunctions.setTeamFunctionId(UUID.randomUUID().toString());
//			tBaseTeamFunctions.setFunctionCode(functionCodeGroup[i]);
//			tBaseTeamFunctions.setTeamCode(teamCode);
//			teamFunctionsMapper.insert(tBaseTeamFunctions);
//		}
    }

    /**
     * Function Name               queryAllTeam
     *
     * @return
     * @description (发送消息加载所有群组 - 消息中心)
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年8月29日 上午11:53:20          SharpClaw_x                     Initial
     * *********************************************************************
     */
    public List<Map<String, Object>> queryAllTeam() {
        List<Map<String, Object>> teamList = teamMapper.queryAllTeam();
        return teamList;
    }

}
